home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / ms_dos / dmove86 / fat_dpb.c < prev    next >
Text File  |  1993-11-30  |  2KB  |  97 lines

  1. /*
  2.  
  3. fat_dpb.c -- FATとDPBの操作関数
  4.  
  5. */
  6.  
  7. #include<stdio.h>
  8. #include<dos.h>
  9. #include<ctype.h>
  10. #include<process.h>
  11. #include<malloc.h>
  12. #include"dmove86.h"
  13.  
  14. extern    struct DPB    Dpb;
  15. extern    int        Drive;
  16. extern    unsigned int    Fatsize;
  17.  
  18. int    getdpb(void)
  19. {    union REGS    regs;
  20.     struct SREGS    seg;
  21.  
  22.     regs.h.ah = 0x32;
  23.     regs.h.dl = Drive + 1;
  24.     int86x(0x21,®s,®s,&seg);
  25.  
  26.     if    (regs.h.al == 0xff)
  27.         return -1;
  28.  
  29.     Dpb = *(struct DPB far *)MK_FP(seg.ds, regs.x.bx);
  30.  
  31.     Fatsize = (Dpb.data_sec - Dpb.iplsectors
  32.             - Dpb.root_entry/(Dpb.seclen >> 5)) / Dpb.fatnum;
  33.  
  34. #ifdef    DEBUG
  35.     printf("FAT size = %u\n",Fatsize);
  36. #endif
  37.  
  38.     return 0;
  39. }
  40.  
  41. unsigned int     *getfat(void)
  42. {
  43.     unsigned int        af;
  44.     unsigned int        pos;
  45.  
  46.     char     *buf;
  47.  
  48.     buf = (char *)malloc(Dpb.seclen * Fatsize);
  49.  
  50.     if    (buf == 0) 
  51.     {
  52. #ifdef    DEBUG
  53.         printf("Not enough memory for malloc()\n");
  54. #endif
  55.         return 0 ;
  56.     }
  57.  
  58.     for (pos=0 ; pos<Fatsize ; pos++)
  59.     {
  60.         af = rdabssec((void far *)(buf + pos*Dpb.seclen),
  61.                 Dpb.iplsectors+pos,Drive);
  62. #ifdef    DEBUG
  63.         printf("AF=%4x\n",af);
  64. #endif
  65.     }
  66.  
  67.     if    (Dpb.maxclu < 0xff7)
  68.     {    /* 12ビットFAT */
  69.  
  70.         unsigned     *fat;
  71.  
  72.         fat=(unsigned *)malloc( (Dpb.maxclu+2) * sizeof(unsigned) );
  73.  
  74.         if    (fat == 0)
  75.         {
  76. #ifdef    DEBUG
  77.             printf("12bit FAT:not enough memory for malloc\n");
  78. #endif
  79.             free(buf);
  80.             return 0;
  81.         }
  82.  
  83.         for    (pos=0 ; pos < Dpb.maxclu/2 ; pos++)
  84.         {
  85.             fat[pos*2  ] = buf[pos*3  ]+ (buf[pos*3+1]&0x0f) * 256;
  86.             fat[pos*2+1] = buf[pos*3+1]/16    + buf[pos*3+2]*16;
  87.  
  88.             if    (fat[pos*2  ] > 0xff6)    fat[pos*2  ] |= 0xf000;
  89.             if    (fat[pos*2+1] > 0xff6)    fat[pos*2+1] |= 0xf000;
  90.         }
  91.         free(buf);
  92.         return (fat);
  93.     }
  94.  
  95.     else     return (unsigned int *)buf;
  96. }
  97.